# -*- coding: utf-8 -*-
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler
from sklearn.decomposition import PCA
import jieba
#import pandas as pd

def skData():
    """
    sklearn的数据集使用
    :return:
    """
    #获取数据集
    iris = load_iris()
    #iris.data返回ndArray类型的数据集
    # print("数据集 \n",iris.data)
    # print("鹫尾花数据描述 \n",iris["DESCR"])
    # print("数据集标签 \n" , iris.target_names)
    # print("数据集标签数组 \n" , iris.target)
    # print("数据集特征数组 \n" , iris.feature_names)
    # print("数组形状", iris.data.shape)
    #这个是干嘛的？没看懂
    # print(iris.target[[10, 25, 50]])

    #数据集划分
    x_train,y_train,x_test,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=20)
    print("训练集特征值\n",x_train,x_train.shape)
    print("训练集目标值\n",x_test,x_test.shape)

def dict_demo():
    """
    字典特征抽取
    :return:
    """
    data = [{'city':'北京','temperature':80},
                {'city':'上海','temperature':50},
                {'city':'广州','temperature':60}]
    print("原矩阵data:",data)
    #实例化一个转换器类
    transfer = DictVectorizer()
    #调用fit_transform()方法
    data_new = transfer.fit_transform(data)
    #稀疏矩阵
    print("稀疏矩阵data_new:",data_new)
    print("稀疏矩阵data_new 字典特征值",transfer.get_feature_names())
    #矩阵还原：
    data_old = transfer.inverse_transform(data_new)
    print("稀疏矩阵还原结果 data_old:",data_old)

    transfer2 = DictVectorizer(sparse=False)
    data_new2 = transfer2.fit_transform(data)
    print("完整矩阵data_new2: ",data_new2)

def wordCount_demo():
    """
    文本特征抽取 CountVectorizer
    统计样本中每个词出现的次数。统计时，将标点符号以及单字母词去掉了。
    但是只按照空格分隔，这样就无法分隔中文。
    要分隔中文的话要进行中文分词，在词中间加空格。而且还是会去掉单个字
    :return:
    """
    data = ["I don't like this life,I will change this life","life is short,enjoy coding"]
    #实例化一个转换器类
    transfer = CountVectorizer()
    #调用fit_transform方法
    data_new = transfer.fit_transform(data)

    print("data_new \n ",data_new)
    print("完整矩阵：\n ",data_new.toarray())
    print("特征名称： \n ",transfer.get_feature_names())

    return None

def cut_chinese(text):
    """
    进行中文分词
    :param text:
    :return:
    """
    #text = "我要这天，再遮不住我眼，要这地再埋不了我心，要这众生，都明白我意，要那诸佛，都烟消云散"
    wordCutter = jieba.cut(text)
    #print("中文分词生成器", wordCutter)
    # 用list将元组转换成列表。然后用join方法，将列表转换成一个字符串。
    result = " ".join(list(wordCutter))
    #print(type(result))
    #print("中文分词结果 ", result)
    return result

def count_chinese_demo():
    """
    对中文进行特征抽取：这里sklearn会默认去掉单个的字
    将一个语句抽取成一系列词的词频。通过词频分析来判断语句的分类属性。
    :return:
    """
    data = ["今天很残酷，明天更残酷，后天会很美好，但是绝大部分人都是死在明天晚上",
            "今天遇到傻逼，明天还是有傻逼，后天会遇到伯乐，但是大部分人在明天晚上就疯了",
            "我要这天，再遮不住我眼，要这地再埋不了我心，要这众生，都明白我意，要那诸佛，都烟消云散",
            "这个天地，我来过，我奋战过，我深爱过，我不在乎结局"]
    #中文分词
    data_cutted = []
    for sentence in data:
        data_cutted.append(cut_chinese(sentence))
    print("中文分词结果： ",data_cutted)

    # 实例化一个转换器类
    transfer = CountVectorizer()
    #如果要排除一些不带感情特色的词，可以加到stop_words
    #CountVectorizer(stop_words=["如果","一个"])
    # 调用fit_transform方法
    data_new = transfer.fit_transform(data_cutted)

    print("data_new \n ", data_new)
    print("完整矩阵：\n ", data_new.toarray())
    print("特征名称： \n ", transfer.get_feature_names())
    return None

def tfidf_demo():
    """
    对中文，计算每个单词的TF-IDF值。这个值代表了每个单词对语句分类的重要程度。
    这样，可以让更重要的词对语句分类的影响更大。相对于
    相比按词频方式分析，这种分析方式应该更科学。
    用词频进行分类，可能会有很多出现次数多，但是分类意义不重要的词影响到分类学习的结果。
    如 我们 你们 他们 今天 明天 这个 那个 等。这些词经常出现，但是其实并不重要。
    :return:
    """
    data = ["今天很残酷，明天更残酷，后天会很美好，但是绝大部分人都是死在明天晚上",
            "今天遇到傻逼，明天还是有傻逼，后天会遇到伯乐，但是大部分人在明天晚上就疯了",
            "我要这天，再遮不住我眼，要这地再埋不了我心，要这众生，都明白我意，要那诸佛，都烟消云散",
            "这个天地，我来过，我奋战过，我深爱过，我不在乎结局"]
    # 中文分词
    data_cutted = []
    for sentence in data:
        data_cutted.append(cut_chinese(sentence))
    print("中文分词结果： ", data_cutted)

    # 实例化一个转换器类
    transfer = TfidfVectorizer()
    # 如果要排除一些不带感情特色的词，可以加到stop_words
    # TfidfVectorizer(stop_words=["如果","一个"])
    # 调用fit_transform方法
    data_new = transfer.fit_transform(data_cutted)

    print("data_new \n ", data_new)
    print("完整矩阵：\n ", data_new.toarray())
    print("特征名称： \n ", transfer.get_feature_names())
    return None

def minMax_Demo():
    """
    归一化处理
    :return:
    """
    #1、获取数据 使用pandas包来读取数据
    #data = pd.read_csv("dating.txt")
    #获取所有行，列取1~3列，也就是只取特征列，target列不需要取
    #data = data.iloc[:,:3]
    #2、实例化一个转换器类 范围默认是0~1，也可以自行指定范围
    #transfer = MinMaxScaler(feature_range=[0,1])
    #3、调用fit_transform
    #将原本不同单位的数据都归一到0~1的范围内。
    #data_new = transfer.fit_transform(data)
    #print("data_new \n",data_new)

    return None

def PCA_DEMO():
    """
    PCA降维 主成分分析
    :return:
    """
    data = [[2,8,4,5],[6,3,0,8],[5,4,9,1]]
    #1、实例化一个转换器类
    #n_components 传整数表示保留几个维度，传小数表示保留百分之多少的信息
    #transfer = PCA(n_components=2)
    transfer = PCA(n_components=0.95)
    #2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new \n",data_new)
    return None

if __name__ == "__main__":
    skData()
    #dict_demo()
    #wordCount_demo()
    #count_chinese_demo()
    #tfidf_demo()
    #minMax_Demo()
    #数据标准化

    #主成份分析
    #PCA_DEMO()
